查看原文
其他

tabplot命令

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:闫宇聪(广西大学)

文字编辑:李钊颖

技术总编:高金凤


笔者最近在看一篇2018年发表在JBF上的论文——Are Chinese credit ratings relevant? A studyof the Chinese bond market and credit rating industry,文章主要阐述了中国的债券评级具有价值信息,但是与国际评级机构的评级尺度不相同,并且不同评级机构对债券投资者的评级有所区别。在这篇文章中作者使用了大量的统计图(如下图1、图2)来进行研究,发现了潜在的问题并最终设计模型来证明了结论。


1:中国债券市场规模和增长率与GDP增长率的关系

22009-2015年中国民间公债发行数量(按发行人类型分为央企、地方国企和非国企)


那么,这些看起来“高大上”的统计图在stata中要怎么画呢?今天小编就给大家介绍一个绘制统计图的命令——tabplot,它可以十分便捷地绘制出一维或二维统计图。

绘制一维统计图时,tabplot的语法结构为:

tabplotvarname [if] [in] [weight] [, options]

绘制二维统计图时,tabplot的语法结构则为:

tabplotrowvar colvar [if] [in] [weight] [, options]

其中,varname代表变量名、rowvar代表行变量名、colvar代表列变量名、weight代表权重、options为附加选项。


下面我们以auto数据为例,制作1978年汽车维修次数(rep78)的一维统计图。我们执行“ssc install tabplot, replace”安装该命令,程序如下:

sysuse auto, cleartabplot rep78


上图只能看出rep78的相对大小,但无具体频数。我们可添加选项showval来显示频数。此外,还可以添加选项horizontal绘制水平条形图。程序如下:

tabplot rep78, showval horizontal


接下来绘制二维统计图,还以auto数据为例,制作汽车类别(foreign)和维修次数(rep78)的二维统计图,如下:

tabplot foreign rep78, showval


基本的二维统计图并不“亮眼”,我们可使用一些附加选项让它更加漂亮,为此,我们介绍几个常用选项:

 

percent(varname)选项结合showval可汇报频率。percent如果不带括号直接使用时,显示的是占整体的频率;如果带括号使用,显示的则是占括号中的变量每个取值的频率,这相当于有了分组功能。

separate(varname)选项和bar#()对条形图中varname变量的每一个取值进行区分。

subtitle()更换图表副标题。

showval中的offset选项,调整输出频数或频率与指定栏底位置之间的偏移量(默认值是0.1)。

showval中的format选项,调整输出的频数或频率格式。

 

再次制作foreign和rep78的二维统计图,使用如下程序:

tabplot for rep78, percent(foreign) sep(foreign) /// bar1(bcolor(red*0.5)) bar2(bcolor(blue*0.5)) showval(offset(0.05) /// format(%2.1f)) subtitle(% by origin)


解释一下这段程序:显示数据占变量foreign每个取值(国产、进口)的频率并调整距离栏底位置0.05,频率保留一位小数,并按照变量foreign的取值,将条形图的颜色进行区分,最后将副标题改为“% by origin”

 

这样,一个比之前更加直观和美观的二维统计图就绘制出来了。

 

除此之外,使用yasisxasis可指定y()变量和x()变量显示数字。如果在连续的数字中出现缺失值,则图中会显示根据数字差异留出的相应空隙,而不显示缺失值本身。

 

我们使用xasis选项来指定x()变量按数字显示出来,如下:

tabplot rep78 mpg, xasis barw(1)


其中barw(1)barwidth(1)的缩写,表示的是条形图中每一条的宽度为1(默认为0.5)。

 

上图中,变量mpg的缺失值空了出来,比如mpg2628之间没有27,但空出了27的位置,这就能更真实地还原数据本身的分布。

 

addplot()选项,可以在已经绘制完成的二维统计图中添加新的图,即将两张变量类型相同但图形类型不同的图,放置在一张图中显示出来。

 

我们在上图的基础上,加入一个带数据标记的折线图,以便更好地看出,在rep78的不同取值下,mpg的均值变动情况。程序及解释如下:

egen mean = mean(mpg), by(rep78) //按照rep78分组,构造变量mpg的均值 gen rep78_2 = 6 - rep78 bysort rep78 : gen byte tag = _n == 1 //生成变量tag,定义为:rep78不同分组中的第一个观测值,tag为1,否则为0tabplot rep78 mpg, xasis barw(1) addplot(connected rep78_2 mean if tag) //生成当tag为1时,纵轴为rep78_2,横轴为mean的带数据标记的折线图


我们可以很清晰地看到,当数据的样本量大于2时,rep78mpg的均值有明显的正相关关系。

 

 

很多时候,在绘制二维统计表的时候,我们要把频数和频率同时显示出来。这时,我们的思路是生成一个新变量,包含频率和频数,然后使用附加选项showval将频率和频数同时输出出来。

 

我们以stata官网上的专家诊断癌症数据rate2.dta为例,制作专家A和专家B的诊断意见的二维统计表。我们先打开数据,具体操作命令如下:

webuse rate2, clearbrowse


数据集中只有频数的变量而没有频率的变量,所以我们需要生成一个包含频率和频数的新变量。首先使用count将全部样本的数量统计出来,然后计算频率,最后绘制包含频率和频数的二维统计图,程序如下:

countbysort rada radb : gen show = string(_N) + " " + string(_N * 100/ `= r(N)', "%2.1f") + "%"tabplot rad?, showval(show) subtitle("frequency and %")

从图中我们可以看到,两位专家诊断意见相同的概率是63.5%,诊断意见相差一级以上的概率只有3.5%,由此可以推断,两位专家诊断同一病人的结果十分相似。

 


有时我们需要依次按照某一变量的取值,生成n张二维统计图,这时就需要将tabplotby进行结合。

 

我们调用上传到stataclub云端上的越战政策数据Vietnam_war_policy.dta(部分)。该调查数据报道了19675月北卡罗莱纳大学教堂山分校学生对越战的意见。policy中的A/B/C/D分别表示:

 

A.美国应该通过广泛轰炸北越的工业、港口和港口,以及土地入侵来击败北越的力量。

B.美国应该遵循目前对越南的政策。

C.美国应该减少军事活动的升级,停止轰炸越南北部,并加紧努力开始谈判。

D.美国应该立即从越南撤军。

 

按照频数(freq)加权后,再按照性别(sex)生成两张关于政策(policy)和学习年限(year)的二维统计表,且按变量sexyear显示百分比,程序如下:

use "https://stata-club-1257787903.cos.ap-chengdu.myqcloud.com/Vietnam_war_policy.dta", clear //从stataclub云端上调用该数据tabplot policy year [w=freq], by(sex, subtitle(% by sex and year, place(w)) note("")) percent(sex year) showval   //place(w)表示将副标题放在整个图的左上角, note("")表示不显示左下角的注释

从图中可知:男同学对越南战争所持意见主要是——政策A(武力解决)和政策C(谈判解决),而且支持武力解决的学生比例随着学习年限的增加而减少,支持谈判解决的学生比例随着学习年限的增加而渐渐增大;而女同学对越南战争倾向于采取谈判解决(政策C)方式。

 

当然,上图还存在着一些缺点,比如,女性的毕业生支持C政策的比例占到了整个女性毕业生的68.4%,但是在上图中,我们的直观感受是,(该比例)就像占到了80%一样。因此,我们还可以使用frame()选项来生成一个比例图,可以更形象、直观地对比不同的意见比例。程序如下:

tabplot policy year [w=freq], by(sex, subtitle(% by sex and year, place(w)) note("")) percent(sex year) showval frame(100)


tabplot最大的优势就是我们在使用它观察数据时,可以让我们感受到比数字更直观的视觉冲击,频数大小和比例都一目了然。表格和图形都是帮助我们理解数据、分析数据、挖掘有用信息的重要形式。当然了,“萝卜白菜,各有所爱”,我们要选择最适合的那种形式,对数据进行反复的“拷打”,从各个角度将数据里的“情报”尽可能多地“逼问”出来。有时候一个不经意间的分组就会诞生一个新的idea,说不定就会成为一篇好文章的开门之匙。



对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

Jupyter Notebook不为人知的秘密

字符串方法(三)

数据,我要“拷打”你

花式调用返回值 —— svret与storedresults
encode 和decode——带你探索编码与解码的世界
字符串方法(二)
如何快速生成分组变量?
用Stata实现数据标准化
字符串方法介绍
Jupyter Notebook的使用
Stata16新功能之“框架”——frlink连接多个数据集(3)
Stata16新功能之“框架”——基础命令大合集(2)
三分钟教你读懂Python报错
解析XML文件
命令更新之reg2docx:将回归结果输出到word
命令更新之t2docx——报告分组均值t检验
数据类型——Dict、Set与Frozenset简析

关于我们

微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存